/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.switz.agendacita.persistence;


import com.switz.agendacita.dto.Servicio;
import com.switz.agendacita.dto.Usuario;
import com.switz.agendacita.persistence.iface.UsuarioDao;
import com.switz.agendacita.vo.ReservacionPendiente;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.ParameterizedBeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;

/**
 *
 * @author jose angel
 */
@Repository
public class UsuarioDaoImpl extends JdbcDaoSupport implements UsuarioDao{

    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
    @Autowired
    public UsuarioDaoImpl(DataSource dataSource) {

        setDataSource(dataSource);
        this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(
				dataSource);
    }

    
    @Override
    public void updateUsuario(Usuario usuario) {
        String query="UPDATE usuarios SET nombre =:nombre,telefono =:telefono,movil =:movil,mail=:mail WHERE id=:id";
        SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(usuario);
        namedParameterJdbcTemplate.update(query, parameterSource);
        
    }
    
       @Override
    public void insertUsuario(Usuario usuario) {
    	
         SimpleJdbcInsert simpleJdbcInsert = new SimpleJdbcInsert(
                getJdbcTemplate().getDataSource())
                .withTableName("usuarios");
           SqlParameterSource parameters = new BeanPropertySqlParameterSource(usuario);
           simpleJdbcInsert.execute(parameters);
        	       	
    }
    
                 
    @Override
    public List selectPersonalEnFuncionServicioEmpresa(String idServicio, String idEmpresa) {
         String query = "select usuarios.id,usuarios.nombre from usuarios inner join"
                 + " personalservicios on usuarios.id=personalservicios.idpersonal "
                 + "where personalservicios.idservicio=? and personalservicios.idempresa=? "
                 + "and usuarios.status=1";
        List personal = getJdbcTemplate().query(query, new Object[]{idServicio,idEmpresa},
                ParameterizedBeanPropertyRowMapper.newInstance(Usuario.class));
        return personal;
    }
    
    @Override
    public void deleteUsuario(Usuario usuario) {
        String query="UPDATE usuarios SET status =:status WHERE id=:id";
        SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(usuario);
              namedParameterJdbcTemplate.update(query, parameterSource);
        
    }


	@Override
	public List selectUsuarioPorMovil(String movil) {
		String query = "SELECT id, nombre, telefono, movil, mail FROM usuarios " +
		 		"WHERE movil=? AND tipousuario=1 AND status=1";
        
		List usuario = getJdbcTemplate().query(query, new Object[]{movil},
                ParameterizedBeanPropertyRowMapper.newInstance(Usuario.class));
        
        return usuario;		
	}


	@Override
	public List selectUsuarioPorTelefono(String telefono) {
		String query = "SELECT id, nombre, telefono, movil, mail FROM usuarios " +
				"WHERE telefono=? AND tipousuario=1 AND status=1";
        
		List usuario = getJdbcTemplate().query(query, new Object[]{telefono},
                ParameterizedBeanPropertyRowMapper.newInstance(Usuario.class));
        
        return usuario;	
	}


	@Override
	public Usuario selectUsuarioPorMail(String mail) {
		String query = "SELECT id, nombre, telefono, movil, mail,status FROM usuarios " +
				"WHERE mail=?";
        
		List usuario = getJdbcTemplate().query(query, new Object[]{mail},
                ParameterizedBeanPropertyRowMapper.newInstance(Usuario.class));
        Usuario usr=usuario.size()>0?(Usuario)usuario.get(0):null;
        
        return usr;	
	}


	@Override
	public Usuario selectUsuarioPorReservacion(String idAgenda) {
		String query = "SELECT usuarios.id, usuarios.nombre, usuarios.telefono, " +
				"usuarios.movil, usuarios.mail FROM usuarios INNER JOIN agenda " +
				"ON usuarios.id=agenda.idusuario WHERE agenda.id=?";
        
		List usuario = getJdbcTemplate().query(query, new Object[]{idAgenda},
                ParameterizedBeanPropertyRowMapper.newInstance(Usuario.class));
        Usuario usr=usuario.size()>0?(Usuario)usuario.get(0):null;
        
        return usr;	
	}
        
    @Override
    public List getReservacionesPendientesPorUsuario(String idUsuario) {
        
        String query=" select empresas.nombre, servicios.descripcion, usuario.nombre, personal.nombre, agenda.fecha, agenda.inicio"
                + " from empresas, servicios, usuarios as usuario, usuarios as personal, agenda "
                + " where empresas.id=agenda.idempresa and "
                + " servicios.id=agenda.idservicio and "
                + "usuario.id=agenda.idusuario and "
                + "personal.id=agenda.idpersonal and "
                + "agenda.idusuario=? and "
                + "agenda.fecha > DATE_FORMAT(NOW(),'%y-%m-%d')";
        
     
               List reservacionesPendientes =
                getJdbcTemplate().query(query,new Object[]{idUsuario}, new ParameterizedRowMapper<ReservacionPendiente>() {
                public ReservacionPendiente mapRow(ResultSet rs, int rowNum) throws SQLException {
                ReservacionPendiente reservacionPendiente = new ReservacionPendiente();
                reservacionPendiente.setFecha(rs.getDate("fecha"));
                reservacionPendiente.setHoraInicio(rs.getTime("agenda.inicio"));
                reservacionPendiente.setNombrePersonal(rs.getString("personal.nombre"));
                reservacionPendiente.setNombreUsuario(rs.getString("usuario.nombre"));
                reservacionPendiente.setNombreEmpresa(rs.getString("empresas.nombre"));
                reservacionPendiente.setDescripcionServicio(rs.getString("servicios.descripcion"));
                return reservacionPendiente;
            }
        });
       return reservacionesPendientes;
    }
            
     
              
    @Override
    public void updatePswUsuario(String psw, String id) {
    	 String query="UPDATE usuarios SET psw =:psw WHERE id=:id";	
    	 MapSqlParameterSource params = new MapSqlParameterSource();
    	 params.addValue("psw", psw);
         params.addValue("id", id);
        		
         namedParameterJdbcTemplate.update(query, params);
                 
    }

    @Override
    public Usuario selectUsuarioPorId(String id) {
        String query = "SELECT movil, mail FROM usuarios WHERE id=?";
        
		List usuario = getJdbcTemplate().query(query, new Object[]{id},
                ParameterizedBeanPropertyRowMapper.newInstance(Usuario.class));
        Usuario usr=usuario.size()>0?(Usuario)usuario.get(0):null;
        
        return usr;	
    }
    
    @Override
	public boolean selectHorarioDisponible(Time horaInicio,
			Time horaFin, String idPersonal, Date fecha) {
		Time horaInicioTolerancia= new Time(horaInicio.getTime()+60000*15);
		Time horaFinTolerancia= new Time(horaFin.getTime()-60000*15);
		int num= getJdbcTemplate().queryForInt("SELECT COUNT(inicio) FROM agenda " +
				"WHERE ((inicio<=? AND fin>?)||(fin>=? AND inicio<? ))" +
				" AND status=1" +
				" AND idpersonal=?" +
				" AND fecha=?", new Object[]{horaInicio,horaInicioTolerancia,horaFin,horaFinTolerancia,idPersonal,fecha});
				
		if(num>0)
			return false;
		else
			return true;
		
	}
    
      @Override
    public Usuario getPsw(String id) {
        String query = "SELECT id,psw FROM usuarios WHERE id=?";
        
		List usuario = getJdbcTemplate().query(query, new Object[]{id},
                ParameterizedBeanPropertyRowMapper.newInstance(Usuario.class));
        Usuario usr=usuario.size()>0?(Usuario)usuario.get(0):null;
        
        return usr;	
    }
    @Override
  	public void updateStatusUsuario(String id) {
  		String updateString="UPDATE usuarios SET status=1 WHERE id=:id";
  		
  		MapSqlParameterSource params = new MapSqlParameterSource();   	   
          params.addValue("id", id);
         		
          namedParameterJdbcTemplate.update(updateString, params);
  		
  	}


  	@Override
  	public Usuario getUsuario(String id) {
  		 String query = "SELECT * FROM usuarios WHERE id=?";
  	        
  		 List usuario = getJdbcTemplate().query(query, new Object[]{id},
  				 ParameterizedBeanPropertyRowMapper.newInstance(Usuario.class));
  	     Usuario usr=usuario.size()>0?(Usuario)usuario.get(0):null;
  	        
  	     return usr;	
  	}
}
